package main

import (
	"fmt"
	"reflect"
)

// Cal 编写一个Cal结构体，有两个字段 Num1和Num2
type Cal struct {
	Num1 int
	Num2 int
}

// GetSub 输出形式为"name 完成了减法运行, Num1 - Num2 = result"
func (c Cal) GetSub(name string) {
	fmt.Printf("%s 完成了减法运行, %d - %d = %d\n", name, c.Num1, c.Num2, c.Num1-c.Num2)
}

func main() {
	var c = Cal{
		Num1: 12,
		Num2: 45,
	}
	ReflectTest(c)
}

func ReflectTest(s interface{}) {
	var rValue = reflect.ValueOf(s)
	var rType = reflect.TypeOf(s)
	// 使用反射遍历Cal结构体所有的字段信息
	for i := 0; i < rValue.NumField(); i++ {
		fmt.Printf("第%d个属性%s的值为%v\n", i+1, rType.Field(i).Name, rValue.Field(i))
	}
	//使用反射机制完成对GetSub的调用
	var params []reflect.Value
	params = append(params, reflect.ValueOf("tom"))
	rValue.MethodByName("GetSub").Call(params)
}
